package ar.com.ctrln.view.dashboard.administracion.liquidacion;

import java.util.Date;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;

import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.select.annotation.Listen;
import org.zkoss.zk.ui.select.annotation.VariableResolver;
import org.zkoss.zk.ui.select.annotation.Wire;
import org.zkoss.zk.ui.select.annotation.WireVariable;
import org.zkoss.zk.ui.util.Clients;
import org.zkoss.zul.Button;
import org.zkoss.zul.Label;
import org.zkoss.zul.ListModelList;
import org.zkoss.zul.Listbox;

import ar.com.ctrln.control.administracion.facturacion.RegistrarFactura;
import ar.com.ctrln.control.administracion.liquidaciones.ConsultarLiquidacion;
import ar.com.ctrln.persistence.model.factura.DetalleFactura;
import ar.com.ctrln.persistence.model.factura.Factura;
import ar.com.ctrln.persistence.model.liquidacion.Componente;
import ar.com.ctrln.persistence.model.liquidacion.ComponenteEgreso;
import ar.com.ctrln.persistence.model.liquidacion.DetalleLiquidacion;
import ar.com.ctrln.persistence.model.liquidacion.Liquidacion;
import ar.com.ctrln.view.ui.comportamientoVentana.AbstractMinimizarVentana;

@VariableResolver(org.zkoss.zkplus.spring.DelegatingVariableResolver.class)
public class ConsultarLiquidacionPeriodo extends AbstractMinimizarVentana {

	private static final long serialVersionUID = -4444803523216571592L;

	@WireVariable
	private ConsultarLiquidacion consultarLiquidacion;

	@WireVariable
	private RegistrarFactura registrarFactura;

	@Wire
	private Listbox lbLiquidaciones;

	private ListModelList<DetalleItem> modelo;

	private Liquidacion liquidacion;

	@Wire
	private Label lTotalIngreso;

	@Wire
	private Label lTotalPagar;

	@Wire
	private Button btnGenerarFactura;

	private double totalIngreso = 0.0;

	private double totalPago = 0.0;

	Set<DetalleItem> items;

	@Override
	public void doAfterCompose(Component comp) throws Exception {
		super.doAfterCompose(comp);

		liquidacion = (Liquidacion) this.getSelf().getParent()
				.getAttribute("liquidacion");

		modelo = new ListModelList<DetalleItem>();

		List<DetalleLiquidacion> detallesLiquidacions = consultarLiquidacion
				.buscarDetalleLiquidacion(liquidacion.getId());

		items = new LinkedHashSet<ConsultarLiquidacionPeriodo.DetalleItem>();

		DetalleItem itemI;

		for (DetalleLiquidacion detalle : detallesLiquidacions) {

			itemI = new DetalleItem();

			DetalleLiquidacion d = (DetalleLiquidacion) detalle;
			itemI.descripcion = "Cliente: " + d.getCliente().getRazonSocial();
			itemI.periodo = d.getMes() + "/" + d.getAnio();
			itemI.sTotal = "$ " + d.getTotal();

			items.add(itemI);
			totalIngreso += ((DetalleLiquidacion) detalle).getTotal();

		}

		generadorDePagos();

		modelo.addAll(items);

		lbLiquidaciones.setModel(modelo);

		lTotalIngreso.setValue("Total Ingresos $"
				+ Double.toString(totalIngreso));
		lTotalPagar.setValue("Total a Pagar $" + Double.toString(totalPago));

	}

	public void generadorDePagos() {

		items.add(new DetalleItem("Interconexión", liquidacion.getMes() + "/"
				+ liquidacion.getAnio(), "$ 120900.00", 120900.00));
		items.add(new DetalleItem("Administración Ancho de Banda", liquidacion
				.getMes() + "/" + liquidacion.getAnio(), "$ 1150.00", 1150.00));
		items.add(new DetalleItem("Co-ubicación", liquidacion.getMes() + "/"
				+ liquidacion.getAnio(), "$ 500.00", 500.00));
		items.add(new DetalleItem("Cuota Cabase", liquidacion.getMes() + "/"
				+ liquidacion.getAnio(), "$ 500.00", 500.00));
		items.add(new DetalleItem("Mantenimiento Fibra Optica", liquidacion
				.getMes() + "/" + liquidacion.getAnio(), "$ 5.900", 5900.00));

		totalPago = (120900.00 + 1150.00 + 500.00 + 500.00 + 5900.00);

	}

	@Listen("onClick = #btnGenerarFactura")
	public void generarFactura() {

		Factura f;
		DetalleFactura df;

		List<DetalleLiquidacion> detalles = consultarLiquidacion
				.buscarDetalleLiquidacion(liquidacion.getId());
		for (DetalleLiquidacion d : detalles) {
			f = new Factura();
			f.setCliente(d.getCliente());
			f.setEstado(Factura.ESTADO_IMPAGA);
			f.setFechaAlta(new Date());
			f.setTotal(d.getTotal());
			f.setImpuesto(d.getTotal() * 0.21);
			f.setSubTotal(d.getTotal() - (d.getTotal() * 0.21));
			registrarFactura.nueva(f);
			for (Componente c : d.getComponentes()) {
				df = new DetalleFactura();

				if (c instanceof ComponenteEgreso) {
					df.setTotal(((ComponenteEgreso) c).getValorNeg());
				} else {
					df.setTotal(c.getTotal());
				}
				df.setComponente(c);
				df.setFactura(f);
				df.setCantidad(1);
				df.setDetalle(c.getNombre());
				registrarFactura.guardarDetalle(df);

			}

		}

		Clients.showNotification("Facturas del Periodo Generadas",
				Clients.NOTIFICATION_TYPE_INFO, null, "middle_center", 2500);

	}

	public class DetalleItem {

		public String descripcion;
		public String periodo;
		public String sTotal;
		public double dTotal;

		public DetalleItem() {
		}

		public DetalleItem(String descripcion, String periodo, String sTotal,
				double dTotal) {
			this.descripcion = descripcion;
			this.periodo = periodo;
			this.sTotal = sTotal;
			this.dTotal = dTotal;
		}

		public String getDescripcion() {
			return descripcion;
		}

		public void setDescripcion(String descripcion) {
			this.descripcion = descripcion;
		}

		public String getPeriodo() {
			return periodo;
		}

		public void setPeriodo(String periodo) {
			this.periodo = periodo;
		}

		public String getsTotal() {
			return sTotal;
		}

		public void setsTotal(String sTotal) {
			this.sTotal = sTotal;
		}

		public double getdTotal() {
			return dTotal;
		}

		public void setdTotal(double dTotal) {
			this.dTotal = dTotal;
		}

	}

}
